package ceura.ia.practica;

import java.util.ArrayList;

/**
 * Esta clase es una abstracción mayor que un nodo, además de tener una posición
 * x e y, se diferencia con un nodo respecto a que debe llevar la cuenta del
 * camino recorrido y la lista de nodos descubiertos.
 *
 * Esta clase se pasa por parámetro al calculador, el cual ira moviendo las
 * coordenadas de dicha instancia, hasta que conicida con el destino y sea la
 * mejor ruta posible.
 *
 * @author Sergio Redondo y Jorge Madrid.
 */
public class Situacion {

    /**
     * Posición 'x'.
     */
    public int x,
            /**
             * Posición 'y'.
             */
            y,
            /**
             *
             */
            G;
    /**
     * Lista de nodos descubiertos.
     */
    public final ArrayList<Nodo> nodosDescubiertos;
    /**
     * Camino recorrido por la situación.
     */
    public final ArrayList<Nodo> caminoRecorrido;
    private ArrayList<Nodo> caminoOptimo;

    /**
     *
     * @param x Posición 'x'.
     * @param y Posición 'y'.
     */
    public Situacion(int x, int y) {
        this.x = x;
        this.y = y;
        this.G = 0;
        nodosDescubiertos = new ArrayList<Nodo>();
        caminoRecorrido = new ArrayList<Nodo>();
    }

    /**
     *
     * @param nodo Nodo al que se movera esta situación.
     */
    public void moverSituacion(Nodo nodo) {
        this.x = nodo.x;
        this.y = nodo.y;
        this.G = nodo.G;
        caminoRecorrido.add(nodo);
    }

    @Override
    public String toString() {
        return "Situacion{" + "x=" + x + ", y=" + y + ", G=" + G + ", listaNodosAdyacentes=" + nodosDescubiertos + ", caminoRecorrido=" + caminoRecorrido + '}';
    }

    /**
     *
     * @param caminoOptimo Camino óptimo calculado por el calculador de
     * laberintos.
     */
    public void setCaminoOptimo(ArrayList<Nodo> caminoOptimo) {
        this.caminoOptimo = caminoOptimo;
    }

    /**
     *
     * @return El camino óptimo.
     */
    public ArrayList<Nodo> getCaminoOptimo() {
        return caminoOptimo;
    }
}
